// 普通类型函数，参数和返回值都指定了类型
function add (num1: number, num2: number): number {
  return num1 + num2
}

const res1 = add(1, 2)

console.log('---res1---', res1)

// 箭头函数，参数和返回值都指定了类型
// 在给函数类型定义类型别名的时候，返回值要通过箭头函数返回得到
type AddFunc = (num1: number, num2: number) => number

// 类型其实就是起到约束的作用
const add2: AddFunc = (num1: number, num2: number) => {
  return num1 + num2
}

const add3: AddFunc = (num1, num2) => {
  return num1 - num2
}

const res2 = add2(2, 3)

console.log('---res2---', res2)

// 没有返回值的函数怎么定义
// 如果没有返回值，则可以加void，也可以不加
function printName (name: string): void {
  console.log(name)
}

// void和undefined是有区别的
function printName2 (name: string): undefined {
  console.log(name)

  return undefined
}

printName('zhangsan')

// 明确要传递的参数，必须放在最前面，可选参数要往后面放，剩余参数也往后放
function slice (xxx: number, start?: number, end?: string) {
  // slice() slice(1) slice(2,5)
  // start，从start开始截取，到最后
  // start，end 从start截取到end
  // 什么都不传，返回原始数组
  if (start) {
    return xxx + start
  }
}

slice(1)

function minus (x: number, y: number) {
  return x - y
}

export {}
